package iface.aplicativo.negocio.entidade;

import iface.arquitetura.entidade.Entidade;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
@Table(name = "veiculo")
@SequenceGenerator(name = "sq_veiculo", sequenceName = "sq_veiculo", allocationSize = 1, initialValue = 1)
public class Veiculo implements Entidade {

	private static final long serialVersionUID = 2373586767063323982L;

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_veiculo")
	@Column(name = "id_veiculo")
	private Long idVeiculo;

	@Column(name = "nr_placa")
	private String nrPlaca;

	@ManyToOne
	@JoinColumn(name = "id_fabricante")
	private Fabricante fabricante;

	@ManyToOne
	@JoinColumn(name = "id_combustivel")
	private Combustivel combustivel;

	@ManyToOne
	@JoinColumn(name = "id_cambio")
	private Cambio cambio;

	@ManyToOne
	@JoinColumn(name = "id_modelo")
	private Modelo modelo;

	@Column(name = "cor")
	private String cor;

	@Column(name = "ano_fab")
	private Integer anoFabricacao;

	@Column(name = "ano_mod")
	private Integer anoModelo;

	@Column(name = "portas")
	private Integer portas;

	@Column(name = "chassi")
	private String chassi;

	@Column(name = "renavam")
	private String renavam;

	@Column(name = "uf")
	private String uf;

	@Column(name = "potencia")
	private Integer potencia;

	@Column(name = "cilindrada")
	private Integer cilindrada;

	@Column(name = "observacao")
	private String observacao;

	@ManyToMany
	@Cascade(value = CascadeType.SAVE_UPDATE)
	@JoinTable(name = "veiculo_acessorio", joinColumns = { @JoinColumn(name = "id_veiculo") }, inverseJoinColumns = { @JoinColumn(name = "id_acessorio") })
	private List<Acessorio> acessorios;

	@OneToMany(mappedBy = "veiculo")
	@OrderBy("id desc")
	private List<EntradaVeiculo> entradaVeiculo;

	@Transient
	private List<Long> acessoriosAux;

	@Transient
	private Double valorCompra;

	@Transient
	private Double valorVenda;

	public Serializable getIdentificador() {
		return getIdVeiculo();
	}

	public Long getIdVeiculo() {
		return idVeiculo;
	}

	public void setIdVeiculo(Long idVeiculo) {
		this.idVeiculo = idVeiculo;
	}

	public String getNrPlaca() {
		return nrPlaca;
	}

	public void setNrPlaca(String nrPlaca) {
		this.nrPlaca = nrPlaca;
	}

	public Fabricante getFabricante() {
		return fabricante;
	}

	public void setFabricante(Fabricante fabricante) {
		this.fabricante = fabricante;
	}

	public Combustivel getCombustivel() {
		return combustivel;
	}

	public void setCombustivel(Combustivel combustivel) {
		this.combustivel = combustivel;
	}

	public Cambio getCambio() {
		return cambio;
	}

	public void setCambio(Cambio cambio) {
		this.cambio = cambio;
	}

	public Modelo getModelo() {
		return modelo;
	}

	public void setModelo(Modelo modelo) {
		this.modelo = modelo;
	}

	public String getCor() {
		return cor;
	}

	public void setCor(String cor) {
		this.cor = cor;
	}

	public Integer getAnoFabricacao() {
		return anoFabricacao;
	}

	public void setAnoFabricacao(Integer anoFabricacao) {
		this.anoFabricacao = anoFabricacao;
	}

	public Integer getAnoModelo() {
		return anoModelo;
	}

	public void setAnoModelo(Integer anoModelo) {
		this.anoModelo = anoModelo;
	}

	public Integer getPortas() {
		return portas;
	}

	public void setPortas(Integer portas) {
		this.portas = portas;
	}

	public String getChassi() {
		return chassi;
	}

	public void setChassi(String chassi) {
		this.chassi = chassi;
	}

	public String getRenavam() {
		return renavam;
	}

	public void setRenavam(String renavam) {
		this.renavam = renavam;
	}

	public String getUf() {
		return uf;
	}

	public void setUf(String uf) {
		this.uf = uf;
	}

	public Integer getPotencia() {
		return potencia;
	}

	public void setPotencia(Integer potencia) {
		this.potencia = potencia;
	}

	public Integer getCilindrada() {
		return cilindrada;
	}

	public void setCilindrada(Integer cilindrada) {
		this.cilindrada = cilindrada;
	}

	public String getObservacao() {
		return observacao;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	public List<Acessorio> getAcessorios() {
		return acessorios;
	}

	public void setAcessorios(List<Acessorio> acessorios) {
		this.acessorios = acessorios;
	}

	public List<Long> getAcessoriosAux() {
		if (acessoriosAux == null) {
			if (this.getAcessorios() != null && !this.getAcessorios().isEmpty()) {
				acessoriosAux = new ArrayList<Long>();
				for (Acessorio ac : this.getAcessorios()) {
					acessoriosAux.add(ac.getId());
				}
			}
		}
		return acessoriosAux;
	}

	public void setAcessoriosAux(List<Long> acessoriosAux) {
		this.acessoriosAux = acessoriosAux;
	}

	public List<EntradaVeiculo> getEntradaVeiculo() {
		return entradaVeiculo;
	}

	public void setEntradaVeiculo(List<EntradaVeiculo> entradaVeiculo) {
		this.entradaVeiculo = entradaVeiculo;
	}

	public Double getValorCompra() {
		return valorCompra;
	}

	public void setValorCompra(Double valorCompra) {
		this.valorCompra = valorCompra;
	}

	public Double getValorVenda() {
		return valorVenda;
	}

	public void setValorVenda(Double valorVenda) {
		this.valorVenda = valorVenda;
	}

}
